package com.siqi.hr.system.organization.service;

import com.siqi.hr.common.Constants;
import com.siqi.hr.common.utils.FileUtils;
import com.siqi.hr.system.common.model.Module;
import com.siqi.hr.system.common.model.ModuleType;
import com.siqi.hr.system.common.sql.STable;
import com.siqi.hr.system.common.utils.EnumUtils;
import com.siqi.hr.system.common.dao.intf.CommonOperationDao;
import com.siqi.hr.system.custom.entity.EntityRecord;
import com.siqi.hr.system.organization.dao.intf.RoleDao;
import com.siqi.hr.system.organization.entity.Employee;
import com.siqi.hr.system.organization.entity.Role;
import com.siqi.hr.system.organization.entity.RoleEntityScope;
import net.sf.json.JSONObject;
import org.apache.commons.lang.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.Assert;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.multipart.support.DefaultMultipartHttpServletRequest;

import java.util.*;

/**
 * 角色信息维护service
 * @author  xiaogq
 * Created by xiaogoingqin on 2016/7/21.
 */
@Service("roleService")
@Transactional(rollbackFor = Exception.class, propagation = Propagation.REQUIRED)
public class RoleService {

    @Autowired
    private RoleDao roleDao;
    @Autowired
    private CommonOperationDao commonOperationDao;

    /**
     * 根据角色id查询该角色可以登录哪些模块
     * @param role（角色对象）
     * @return
     */
    public List<Module> getRoleModule(Role role) throws Exception{
        return this.roleDao.getRoleModule(role.getId());
    }

    /**
     * 将角色可登陆系统模块字符串转换成集合对象
     * @param rolemodule（模块id）
     * @return
     */
    public List<Module> getListRoleModule(String rolemodule) throws Exception{
        Assert.hasText(rolemodule);

        List<Module> moduleList = new ArrayList<Module>();
        Collection<ModuleType> modules = EnumUtils.tranform(rolemodule, ModuleType.class);
        for (ModuleType mod : modules) {
            Module module = new Module();
            module.setId(mod.getCode());
            module.setName(mod.name());
            module.setInchinese(mod.getDesc());
            moduleList.add(module);
        }
        return moduleList;
    }

    /**
     * 根据角色Id、实体id获取数据权限标识
     * @author                 xiaogq
     * @param roleId          角色Id
     * @param entityRecord   实体对象信息
     * @return
     */
    public RoleEntityScope queryRoleDataScope(String roleId, EntityRecord entityRecord) {
        return roleDao.queryRoleDataScope(roleId,entityRecord);
    }

    /**
     * 删除角色数据
     * @param tableName   （表名）
     * @param dataId       （数据id）
     * @throws Exception
     */
    public JSONObject deleteRole(String tableName, String dataId) throws Exception{
        JSONObject obj = new JSONObject();
        STable table = new STable(tableName);
        obj.put("success","success");
        if(dataId.equals(Constants.ROOTROLEID)){
            obj.put("success","nodel");
        }else{
            commonOperationDao.deleteTData(table, dataId);
        }
        return obj;
    }

    /**
     * 添加角色信息
     * @param dataMap             前台页面form表单提交的值
     * @param entityRecord       实体对象
     * @param emp                 当前登陆系统用户信息对象
     * @return
     * @throws Exception
     */
    public String addRoleData(Map<String,Object> dataMap, EntityRecord entityRecord, Employee emp) throws Exception{
        String id = commonOperationDao.addTData(dataMap, entityRecord, emp);
        return id;
    }

    /**
     * 修改角色信息
     * @param dataMap
     * @param entityRecord
     * @param emp
     * @param id
     * @return
     * @throws Exception
     */
    public int updateRoleData(Map<String,Object> dataMap, EntityRecord entityRecord, Employee emp, String id) throws Exception{
        return commonOperationDao.updateTData(dataMap, entityRecord, emp, id);
    }

    /**
     * 停用角色数据
     * @author    xiaogq
     * @param tableName（表名）
     * @param dataId（数据id）
     * @throws Exception
     */
    public void disableRole(final String tableName, final String dataId) throws Exception{
        STable table = new STable(tableName);
        commonOperationDao.disableTDate(table, dataId);
    }

    /**
     * 启用角色数据
     * @author    xiaogq
     * @param tableName（表名）
     * @param dataId（数据id）
     * @throws Exception
     */
    public void enableRole(final String tableName, final String dataId) throws Exception{
        STable table = new STable(tableName);
        commonOperationDao.enableTDate(table, dataId);
    }

    /**
     * 根据角色id查询系统菜单、业务菜单方法
     * @author    xiaogq
     * @param roleid     角色id
     * @param kind        系统菜单还是业务菜单(sys:系统菜单，bus:业务菜单)
     * @return
     */
    public String queryRoleMenus(String roleid, String kind) {
        return roleDao.queryRoleMenus(roleid, kind);
    }

    /**
     * 角色系统配置权限、crm权限保存
     * @param roleid     角色id
     * @param kind       是系统菜单还是业务菜单()
     * @param menuids    菜单id字符串
     */
    public JSONObject updateRolePms(String roleid, String kind, String menuids) {
        JSONObject obj = new JSONObject();
        int lens = roleDao.updateRolePms(roleid, kind, menuids);
        obj.put("flag",lens > 0);
        return obj;
    }

    /**
     * 根据角色id获取操作权限列表受权限控制实体信息
     * @author    xiaogq
     * @param roleid      角色id
     */
    public List<Map<String, Object>> queryRoleOperationPms(String roleid) {
        return roleDao.queryRoleOperationPms(roleid);
    }

    /**
     * 保存系统数据权限配置信息方法
     * @author             xiaogq
     * @param roleid      角色id
     * @param reoList     角色对应实体操作权限数据范围
     */
    public JSONObject updateRoleOperationPms(String roleid,List<Map<String, Object>> reoList) {
        JSONObject obj = new JSONObject();
        int lens = roleDao.updateRoleOperationPms(roleid, reoList);
        obj.put("flag", lens > 0);
        return obj;
    }

    /**
     * 根据角色id获取数据权限列表受权限控制实体信息
     * @author    xiaogq
     * @param roleid      角色id
     */
    public List<RoleEntityScope> queryRoleDataPms(String roleid) {
        return roleDao.queryRoleDataPms(roleid);
    }

    /**
     * 获取数据权限所有枚举值(全部，本部门及下级部门，本部门，相关部门，自己，无)
     * @author    xiaogq
     * @return
     */
    public List<Map<String, Object>> queryAllDataScope() {
        return roleDao.queryAllDataScope();
    }

    /**
     * 保存系统数据权限配置信息方法
     * @author             xiaogq
     * @param roleid      角色id
     * @param redList     角色对应实体数据权限数据范围
     */
    public JSONObject updateRoleDataPms(String roleid,List<Map<String, Object>> redList) {
        JSONObject obj = new JSONObject();
        int lens = roleDao.updateRoleDataPms(roleid, redList);
        obj.put("flag",lens > 0);
        return obj;
    }

}
